package cxydmmszl.chapter05.t093;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

/**
 * <li style="color: red;">Prob</li>
 * 拼接所有的字符串产生字典序最小的字符串
 * <li style="color: green;">Desc</li>
 * 给定一个字符串的数组 strs，请找到一种拼接顺序，使得所有的字符串拼接
 * 起来组成的字符串是所有可能性中字典序最小的，并返回这个字符串。
 * <li style="color: green;">Input</li>
 * 输入包含多行，第一行包含一个整数 n(1≤n≤10^5)，代表字符串数组 strs 的长度，
 * 后面 n 行，每行一个字符串，代表 strs[i]（保证所有字符串长度都小于 10）。
 * <li style="color: green;">Output</li>
 * 输出一行，包含一个字符串，代表返回的字典序最小的字符串。
 * <li style="color: blue;">Link</li> CD130
 *
 * @author habitplus
 * @since 2021-10-10 22:21
 */
public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        List<String> strs = new ArrayList<>();
        String s;
        for (int i = 0; i < n; i++) {
            s = br.readLine();
            strs.add(s);
        }

        s = joinStrsToMinStr(strs);
        System.out.println(s);
    }

    private static String joinStrsToMinStr(List<String> strs) {
        if (strs == null || strs.size() == 0) return "";

        /*
            自定义排序
         */
        Collections.sort(strs, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return (o1 + o2).compareTo(o2 + o1);
            }
        });

        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < strs.size(); i++) {
            sb.append(strs.get(i));
        }
        return sb.toString();
    }
}
